package com.dayu.gulimall.order;

import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**
 * 使用RabbitMQ
 *  引入了ampq平台，RabbitAutoConfiguration就会生效
 *  2、给容器自动配置了RabbitTemplate、AmqpAdmin、RabbitConnectionFactoryBean、CachingConnectionFactory、RabbitMessagingTemplate
 *  所有属性都是spring.rabbitmq
 * @ConfigrationProperties(prefix="spring.rabbitmq")
 * @ConfigurationProperties(
 *     prefix = "spring.rabbitmq"
 * )
 * 3、给配置文件中配置"spring.rabbitmq"
 * 4、@EnableRabbit开启动能
 * 5、监听消息：使用@RabbitListener，必须要开启@EnableRabbit
 *
 * 6、 @RabbitListener 可以添加在类+方法上
*      @RabbitHandler 添加在方法上，可以重载方法区分不同的消息
 *
 *   本地事务失效的问题：
 *    同一个对象内 事物方法互调默认失效，原因：绕过了代理对象，事物使用代理对象来控制的
 *    解决：使用代理对象来调用事物的方法
 *  1). pom.xml导入 spring-boot-starter-aop，此包引用了aspectj
 *  2. @EnableAspectJAutoProxy; 开启aspectj动态代理，以后所有的动态代理都是aspectj代理创建的（即使没有接口也可以创建动态代理）
 *      @EnableAspectJAutoProxy(exposeProxy = true)对外暴露代理对象
 *  3.本类互调用
 *     //使用aspectj动态代理 ，创建本类实例，然后调用本类方法，就可以解决事物失效问题
 *         OrderServiceImpl orderService = (OrderServiceImpl) AopContext.currentProxy();
 *         orderService.b(); //新事物，不回滚
 *         orderService.c();//事物，回滚
 *
 * Seata控制分布式事物
 * 1、每个微服务创建一个undo_log;
 * 2、安装事物协调器： seata-server
 * 3、整合
 *  1.导入依赖 spring-cloud-starter-alibaba-seata ,seata-all-1.0
 *
 *
 */
@EnableAspectJAutoProxy(exposeProxy = true)
@EnableFeignClients
@EnableRedisHttpSession
@EnableDiscoveryClient
@EnableRabbit
@SpringBootApplication
public class GulimallOrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallOrderApplication.class, args);
    }

}
